oprava chybneho odradkovani

Otázka od: Lukas Gebauer

6. 4. 2004 11:40

Zapasim s drobnym problemem...

Potrebuji stringlist nakrmit radky ze souboru. To je vcelku
jednoducha vec, jenze ja mam k dispozici soubory se spatnym
odradkovavanim, tedy misto CRLF obsahuji sekvence CRCRLF.

To kdyz nasypu pomoci loadfromfile, tak je to rychle, ale kazde CR
navic vyrobi navic cely prazdny radek.

Mate nekdonapady, jak tot napravit? Ja napady mam, ale zadny z tech
napadu nepracuje rychle! Obcas se totiz jedna o soubory s velikosti
nekolik megabytu, a vse co jsem zkousel je moc pomale.

tedy nahrazvani sekvence znaku, nebo mazani prazdnych radek jsou
cesty prilis pomale. Mate nekdo nejaky napad, co by mohlo byt
nejrychlejsi?

P.S. napady na donuceni nekomunikativniho autora chybneho programu,
aby svoji chybu opravil, jsou take vitany.  



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Petr Fejfar

6. 4. 2004 12:20

Lukas Gebauer wrote:

> Mate nekdonapady, jak tot napravit? Ja napady mam, ale zadny z tech
> napadu nepracuje rychle!

Nejeffeltivnejsi reseni musi byt z principu vlastni potomek TStringList,
ktery bude mit overridnutou metodu SetTextStr(),
ktera tam ty nadbytecne radky vubec vkladat nebude.

HTH, pf



Odpovedá: Karel Rys

6. 4. 2004 13:13

Lukas Gebauer dne 6 Apr 2004 v 12:40:

> Zapasim s drobnym problemem...
>
> Potrebuji stringlist nakrmit radky ze souboru. To je vcelku
> jednoducha vec, jenze ja mam k dispozici soubory se spatnym
> odradkovavanim, tedy misto CRLF obsahuji sekvence CRCRLF.
>
> To kdyz nasypu pomoci loadfromfile, tak je to rychle, ale kazde CR
> navic vyrobi navic cely prazdny radek.

Ahoj,

mozna soubor namapovat do pameti, pak ho prochazet znak po znaku, sam si z toho
vykousat ty
retezce a pridavat je do stringlistu po jednom?

Karel Rys


Odpovedá: Jan Fiala

6. 4. 2004 13:20

6.4.2004 Lukas Gebauer:
> Zapasim s drobnym problemem...

> Potrebuji stringlist nakrmit radky ze souboru. To je vcelku
> jednoducha vec, jenze ja mam k dispozici soubory se spatnym
> odradkovavanim, tedy misto CRLF obsahuji sekvence CRCRLF.

> To kdyz nasypu pomoci loadfromfile, tak je to rychle, ale kazde CR
> navic vyrobi navic cely prazdny radek.

Vlastni nacitani do TStringList.Zdroj mas primo v Delphi u
TStringList.LoadFromFile - Copy / Paste + drobna uprava

--
Jan Fiala
mailto:jan.fiala@wo.cz


Odpovedá: BS Info

6. 4. 2004 13:21

A co natahnout soubor do stringu, a necim takovym to vycistit:

while (Pos(#13#13, mystr)<>0) do Delete(mystr,Pos(#13#13, mystr),1);

----- Original Message -----
From: "Karel Rys" <delphi@zas-me.cz>
To: <delphi-l@clexpert.cz>
Sent: Tuesday, April 06, 2004 1:34 PM
Subject: Re: oprava chybneho odradkovani


> Lukas Gebauer dne 6 Apr 2004 v 12:40:
>
> > Zapasim s drobnym problemem...
> >
> > Potrebuji stringlist nakrmit radky ze souboru. To je vcelku
> > jednoducha vec, jenze ja mam k dispozici soubory se spatnym
> > odradkovavanim, tedy misto CRLF obsahuji sekvence CRCRLF.
> >
> > To kdyz nasypu pomoci loadfromfile, tak je to rychle, ale kazde CR
> > navic vyrobi navic cely prazdny radek.
>
> Ahoj,
>
> mozna soubor namapovat do pameti, pak ho prochazet znak po znaku, sam si z
toho vykousat ty
> retezce a pridavat je do stringlistu po jednom?
>
> Karel Rys
>
>
>


Odpovedá: Lukas Gebauer

6. 4. 2004 13:41

> A co natahnout soubor do stringu, a necim takovym to vycistit:
>
> while (Pos(#13#13, mystr)<>0) do Delete(mystr,Pos(#13#13, mystr),1);

To je prave strasne pomale, protoze to si pri pocturadku nekolik
desitek ticsic vyzaduje opravdu mnoho relokaci strigu v pameti.

Ono totiz kdyz vymazes ten jeden znak uvnitr stingu, tak to si vyzada
posununuti zbytku stringu v pameti o jeden byte vpred. A presouvas
pomerne hodne dat, a to delas tolikrat, kolik mas radek. To je zatim
nejpomalejsi reseni, na ktere jsem narazil. ;-(


--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Lukas Gebauer

6. 4. 2004 14:01

> Nejeffeltivnejsi reseni musi byt z principu vlastni potomek TStringList,
> ktery bude mit overridnutou metodu SetTextStr(),
> ktera tam ty nadbytecne radky vubec vkladat nebude.

Tohle vypada jako nadejna cesta, ktera mne upravdu nenapadla.
Prepsani teto metody bude asi nejlepsi reseni.
Resektive vylepseni teto metody tak, aby to divne odradkovani bralo
jako normalni odradkovani.   Dik.


--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Petr Vones

6. 4. 2004 13:54

From: "Lukas Gebauer" <gebylist@mlp.cz>
> Ono totiz kdyz vymazes ten jeden znak uvnitr stingu, tak to si vyzada
> posununuti zbytku stringu v pameti o jeden byte vpred. A presouvas
> pomerne hodne dat, a to delas tolikrat, kolik mas radek. To je zatim
> nejpomalejsi reseni, na ktere jsem narazil. ;-(

Samozrejme, musis zdrojovy stream / filemapping nacitat znak po znaku a cilovy
vytvaret. Ne presouvat data v jiz hotovem stringu.

Petr Vones


Odpovedá: Lukas Gebauer

6. 4. 2004 14:18

> > Ono totiz kdyz vymazes ten jeden znak uvnitr stingu, tak to si vyzada
> > posununuti zbytku stringu v pameti o jeden byte vpred. A presouvas
> > pomerne hodne dat, a to delas tolikrat, kolik mas radek. To je zatim
> > nejpomalejsi reseni, na ktere jsem narazil. ;-(
>
> Samozrejme, musis zdrojovy stream / filemapping nacitat znak po znaku a
cilovy
> vytvaret. Ne presouvat data v jiz hotovem stringu.

No jasne.. takze to nactu do pameti jednou, pak to peclive prolezu a
presypu na jine misto v pameti, abych vysledek opet prolezl a nasypal
na treti misto v pameti v ramci stringlistu? To upravdu neni nejlepsi
reseni. jak ohledne rychlosti, tak ohledne pametovych naroku. Kdyz uz
to jednou prolejzam, tak je lepsi to rovnou krmit do toho
stringlistu, ne?

Meztim jsem zkusil overridnout tu metodu Settextstr, coz je skutecne
nejlepsi a nejjednodusi reseni, funguje to proste stejne rychle jako
obycejne loadfromfile, coz mne uspokojilo. Neni nad to jit rovnou ke
zdroji, a opravit to v tom miste, kde se prichozi data rozsekavaj na
jednotlive radky. Dik za nakopnuti.


--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Jiri Cincura

6. 4. 2004 22:07

Lukas Gebauer wrote:
> Mate nekdonapady, jak tot napravit? Ja napady mam, ale zadny z tech
> napadu nepracuje rychle! Obcas se totiz jedna o soubory s velikosti
> nekolik megabytu, a vse co jsem zkousel je moc pomale.

Ahoj,
  co tohle:

Nasypu StringList i s chybama.
Udelam Sort.
A vsechno co je na zacatku (pokud neudelas vlastni Sort) az k prvnimu dobre
zahodim.

Predpoklada to ovsem, ze *kazdy* prazdny radek je spatny a tedy na vyhozeni.

No a vzhledem k tomu, ze Sort je implementovan jako QuickSort, je to velmi
rychle (log slozitost pokud nejni pivot hned na kraji).

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
web: http://www.cincura.net; http://cincura.net/photo


Odpovedá: Jan Krizek

7. 4. 2004 6:14

> Lukas Gebauer wrote:
> > Mate nekdonapady, jak tot napravit? Ja napady mam, ale zadny z tech
> > napadu nepracuje rychle! Obcas se totiz jedna o soubory s velikosti
> > nekolik megabytu, a vse co jsem zkousel je moc pomale.
>
> Ahoj,
> co tohle:
>
> Nasypu StringList i s chybama.
> Udelam Sort.
> A vsechno co je na zacatku (pokud neudelas vlastni Sort) az k
> prvnimu dobre zahodim.
>
> Predpoklada to ovsem, ze *kazdy* prazdny radek je spatny a
> tedy na vyhozeni.
>
> No a vzhledem k tomu, ze Sort je implementovan jako
> QuickSort, je to velmi rychle (log slozitost pokud nejni
> pivot hned na kraji).

To asi nebude to prave. Nevim jake ma soubory Lukas, ale ja
problematicke odradkovavani resil vetsinou v textovych souborech (tim
myslim soubor ve kterem je souvisly text ne data), takze prohazeni radek
tridenim je sice zajimave, ale nema vyznam. Navic oproti projiti celeho
seznamu a vyhazeni prazdnych radek to trva mnohem dele.

Reseni vsech moznych chyb v odradkovani je opravdu treba resit dokud ma
clovek zdrojovy stream a sam si muze osetrit co udela kdyz prijde CRCRLF
a co kdyz treba LFCR a tak. Ja teda podobnou vec resil ctenim ze streamu
a rucnim krajenim (zvladam tak vyporadani se CRLF, LF, CR a jestli si
dobre pamatuji tak i LFCR), navic jsem to prohanel prevodnima funkcema
ze synapse.

A jeste jednou zkusim osvetu - pri trideni textu QSort neni n.log(n)
instrukci, protoze nevim o procesoru, ktery by dva retezce porovnal v
konstantnim case. Jak asymptoticky tak i realne je rychlejsi trideni
pomoci BucketSort, ktery jsem tu kdysi popsal, kdyz se resilo trideni
ceskych textu.

Honza +

Odpovedá: Lukas Gebauer

7. 4. 2004 7:33

> Predpoklada to ovsem, ze *kazdy* prazdny radek je spatny a tedy na vyhozeni.

To je spatny predpoklad... prazdny radek je take dulezity, kdyz je
tam kde ma byt.   Napriklad ja tim nacitam e-maily, kde prazdny
radek ma velky vyznam! bez prazdneho radku to tam nejde! (prazdny
radek se pouziva jako oddelovac mezi hlavickami a telem zpravy!)

Nicmene problem uz je uspesne a jednoduse vyresen, jak jsem uz zde
psal.  



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.